package com.dale.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.dale.common.dto.CommentDto;
import com.dale.common.lang.Result;
import com.dale.entity.Comment;
import com.dale.service.CommentService;
import com.dale.service.UserService;
import com.dale.shiro.AccountProfile;
import com.dale.util.SensitiveFilter;
import com.dale.util.ShiroUtil;
import org.apache.shiro.authz.annotation.Logical;
import org.apache.shiro.authz.annotation.RequiresAuthentication;
import org.apache.shiro.authz.annotation.RequiresRoles;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.util.List;

/**
 * @author Gyt
 * @create 2021-05-24 - 15:20
 */
@RestController
public class CommentController {

    @Autowired
    private CommentService commentService;

    //为了实现目标评论的名字展示
    @Autowired
    private UserService userService;

    /**
     * 新版本 找到所有评论
     *
     * @return
     */
    @RequestMapping("/getAllComments/{bid}")
    public Result getAllComments(@PathVariable Long bid, @RequestParam(defaultValue = "1") Integer currentPage) {
        //MybatisPlus分页  参数(起始页面、个数)
        Page page = new Page(currentPage, 5);

        return Result.succ(commentService.getAllComments(page, bid));
    }

    /**
     * 找父评论   附带了子评论
     * 新增功能  增加 评论者的头像姓名 时间  使用连接查询
     *
     * @param bid
     * @return
     */
    @GetMapping("/findParentComment/{bid}")
    public Result findParentComment(@PathVariable Long bid, @RequestParam(defaultValue = "1") Integer currentPage) {

        //MybatisPlus分页  参数(起始页面、个数)
        Page page = new Page(currentPage, 5);


        IPage parentComment = commentService.findParentComment(page, bid);

        List<CommentDto> records = parentComment.getRecords(); //父评论

        for (CommentDto record : records) {
            //植入每一个父评论的子评论   不分页了
            Long cid = record.getCid();
            List<CommentDto> allChildComments = commentService.findAllChildComments(cid);
            for (CommentDto comment : allChildComments) {
                if (comment.getTouserId() != null)
                    comment.setTouser(userService.getById(comment.getTouserId()).getUsername());
            }
            record.setCommentDtoList(allChildComments);
        }

        parentComment.setRecords(records);

        return Result.succ(parentComment);
    }


    @GetMapping("/findParentCommentById/{bid}")
    public Result findParentCommentById(@PathVariable Long bid) {
        return Result.succ(commentService.getById(bid));
    }

    /**
     * 找子评论
     *
     * @param cid
     * @return
     */
    @GetMapping("/findChildComment/{cid}")
    public Result findChildComment(@PathVariable Long cid, @RequestParam(defaultValue = "1") Integer currentPage) {

        //MybatisPlus分页  参数(起始页面、个数)
        Page page = new Page(currentPage, 5);
        return Result.succ(commentService.findChildComment(page, cid));
    }

    /**
     * 留言
     *
     * @return
     */
    @RequiresRoles(value = {"common", "admin"}, logical = Logical.OR)     //表示是普通用户 或者 admin用户可访问
    @RequiresAuthentication
    @PostMapping("/commentParent")
    public Result comment(@RequestBody Comment comment) {
        //敏感词检测替换
        String content = SensitiveFilter.replaceWords(comment.getContent());
        comment.setContent(content);
        /*
        前端只传来了content bid
        需要设置 作者  头像  时间
         */

        AccountProfile profile = ShiroUtil.getProfile();

        comment.setAvatar(profile.getAvatar());
        comment.setAuthor(profile.getUsername());
        comment.setUid(profile.getId());

        comment.setCreated(LocalDateTime.now());

        commentService.save(comment);

        return Result.succ(null);
    }

    /**
     * 子评论 给评论评论
     *
     * @param comment
     * @return
     */
    @RequiresRoles(value = {"common", "admin"}, logical = Logical.OR)     //表示是普通用户 或者 admin用户可访问
    @RequiresAuthentication
    @PostMapping("/commentChild")
    public Result commentChild(@RequestBody Comment comment) {

        /*
        前端只传来了content parentCid
        需要设置 作者  头像  时间
         */

        AccountProfile profile = ShiroUtil.getProfile();


        comment.setAvatar(profile.getAvatar());
        comment.setAuthor(profile.getUsername());
        comment.setUid(profile.getId());



        /*
        第二版本：给子评论也加上bid 然后统一显示 然后前端用 是否有parent_cid来区分
         */
        Long parentCid = comment.getParentCid();
        //通过父评论找到
        Long bid = commentService.getOne(new QueryWrapper<Comment>().eq("cid", parentCid)).getBid();
        comment.setBid(bid);

        comment.setCreated(LocalDateTime.now());
        comment.setUid(profile.getId());
        comment.setTouserId(comment.getTouserId());

        commentService.save(comment);

        return Result.succ(null);
    }


    /**
     * 给子评论 评论
     * 他们是平级   同属于 一个父评论下
     * 前端传来当前你选择评论的作者
     * 然后就设置我评论的人是谁
     */
    @RequiresRoles(value = {"common", "admin"}, logical = Logical.OR)     //表示是普通用户 或者 admin用户可访问
    @RequiresAuthentication
    @PostMapping("/commentLast")
    private Result commentLast(@RequestBody Comment comment) {

        //基本信息填补
        AccountProfile profile = ShiroUtil.getProfile();
        comment.setAvatar(profile.getAvatar());
        comment.setAuthor(profile.getUsername());
        comment.setUid(profile.getId());


        /*
        第二版本：给子评论也加上bid 然后统一显示 然后前端用 是否有parent_cid来区分
         */
        Long parentCid = comment.getParentCid();
        //通过父评论找到 设置博客id
        Long bid = commentService.getOne(new QueryWrapper<Comment>().eq("cid", parentCid)).getBid();
        comment.setBid(bid);


        comment.setCreated(LocalDateTime.now());
        comment.setUid(profile.getId());


        //设置你给谁评论
        comment.setTouser(comment.getAuthor());


        commentService.save(comment);

        return Result.succ(null);
    }


    /**
     * 获取子评论数目
     *
     * @return
     */
    @GetMapping("/ccommentCount/{cid}")
    public int ccommentCount(@PathVariable Long cid) {
        return commentService.count(new QueryWrapper<Comment>().eq("parent_cid", cid));

    }


    /**
     * 根据评论id删除评论
     * 本来业务比较复杂 现在由于时间不够 没管
     * 1：如果是留言（父评论） 还需要 删除 所有的子评论
     * <p>
     * //这里就简单的直接删除就行了 虽然能通过postman拿到子评论（如果只删除父评论）
     * //其实也不麻烦
     * //这个权限只交给admin ！！！！！！！！！！！
     *
     * @param cid
     * @return
     */
    @RequiresRoles("admin")
    @PostMapping("/delCommentByCid/{cid}")
    public Result delCommentByCid(@PathVariable Long cid) {
        commentService.removeById(cid);
        return Result.succ(null);
    }

    /**
     * 分页返回所有的评论
     * <p>
     * 前端需要展示 评论内容（二级展示） 评论时间 评论作者 评论是留言还是子评论（if else null判断）
     *
     * @return
     */
    @RequiresRoles("admin")
    @PostMapping("/listComments")
    public Result listComments(@RequestParam(defaultValue = "1") Integer currentPage) {
        Page page = new Page(currentPage, 10);
        IPage page1 = commentService.page(page, new QueryWrapper<Comment>().orderByDesc("created"));

        return Result.succ(page1);
    }
}
